//
//  SQLiteDataBaseManager.m
//  UI18_SQLite
//
//  Created by dllo on 16/8/8.
//  Copyright © 2016年 yh. All rights reserved.
//

#import "SQLiteDataBaseManager.h"
#import "ImageUrl.h"

@implementation SQLiteDataBaseManager
// 单例 创建方式 只有一个对象(在整个程序运行过程中 一直存在 不要给他释放)
// 内存管理中 单例不能被释放
+ (SQLiteDataBaseManager *)sharedManager {
    // 静态变量 static + 类名
    static SQLiteDataBaseManager *manager = nil;
    // 保证线程安全执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 创建
        manager = [[SQLiteDataBaseManager alloc] init];
    });
    return manager;
}

// 打开数据库
- (BOOL)openSQLite3 {
    // 获取沙盒
    NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [array firstObject];
    // 数据库SQLite3文件类型.db
    NSString *dbPath = [path stringByAppendingPathComponent:@"pic1.db"];
    NSLog(@"%@", dbPath);
    // UTF8String: 将OC字符串转换成C语言中的字符串
    // 参数1: 数据库文件路径
    // 参数2: 指向指针的指针 该指针可以被修改 数据库管理的指针
    int result = sqlite3_open([dbPath UTF8String], &dbPoint);
    BOOL isOpen = YES;
    // sqlite3_open 当路径文件不存在时 路径文件会被sqlite3_open创建 并打开
    // 当sqlite3_open 存在时 文件直接被打开
    // sqlite3_open 返回值为int型 "0"代表成功(SQLite_OK)    "1"代表失败
    if (result == SQLITE_OK) {
        NSLog(@"打开数据库成功");
        isOpen = YES;
    } else {
        NSLog(@"打开数据库失败");
        isOpen = NO;
    }
    return isOpen;
}

// 创建表
- (BOOL)createTable {
    // SQL语句 create table 表名 (字段1 类型 约束, 字段2 类型 约束........)
    //    NSString *createSQL = @"create table stu(stu_id integer primary key, stu_name text)";
    // primary key: 一个表有且只有一个主键
    // autoincrement: 自增 添加完该字段 系统会自己创建一个数据库表 sqlite_sequence 用来保存自增的值
    // not null: 不能为空 如果为空 SQL会报错
    // 删除一个表 drop table + 表名(SQL语句)
    NSString *createSQL = @"create table image1(image_id text NOT NULL, imageStr text NOT NULL)";
    // 执行SQL语句 参数1: 数据库指针 参数2:SQL语句 剩下的都是null
    int result = sqlite3_exec(dbPoint, [createSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"创建表"];
}

- (BOOL)insertData:(ImageUrl *)picStr {
        
//    NSString *insertSQL = [NSString stringWithFormat:@"insert into stu values (%ld, '%@')", stu.stu_id, stu.stu_name];
    NSString *insertSQL = [NSString stringWithFormat:@"insert into image1 values ('%@', '%@')", picStr.image_id, picStr.imageStr];
    // 如果设置了自增 将值填写为null 默认从1开始 如果填写其他值 例如:填入7 值将会从7开始计算 并存储在sqlite_sequence
//    NSString *insertSQL = @"insert into stu7 values (null, 'Eason')";
    int result = sqlite3_exec(dbPoint, [insertSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"插入数据"];
}
// 查询
- (__kindof NSArray *)selectAll {
    sqlite3_stmt *stmt = NULL;
    NSString *selectAll = @"select * from image1";
    // 参数1: 数据库指针
    // 参数2: SQL语句
    // 参数3: SQL语句长度 -1
    // 参数4: 替身 将查询到的内容放到替身中 并将替身返回
    int result = sqlite3_prepare(dbPoint, [selectAll UTF8String], -1, &stmt, NULL);
    NSMutableArray *imageArray = [NSMutableArray array];
    if (result == SQLITE_OK) {
        // 循环 遍历替身内容 直到 SQLITE_DONE
        // step 查询替身中有没有其他数据 当包含有其他数据时 结果为SQLITE_ROW 当不包含其他数据时 结果为 SQLITE_DONE 结束执行
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 取对应的每一列数据
            const unsigned char *pic_id = sqlite3_column_text(stmt, 0); //
            const unsigned char *picURL = sqlite3_column_text(stmt, 1); //
            ImageUrl *url = [[ImageUrl alloc] init];
            url.imageStr = [NSString stringWithUTF8String:(const char *)picURL];
            url.image_id = [NSString stringWithUTF8String:(const char *)pic_id];
            [imageArray addObject:url];
        }
    }
    // 替身用完了要销毁
    sqlite3_finalize(stmt);
    return imageArray;
}

- (BOOL)deletePic:(ImageUrl *)pic {
    NSString *deleteSQL = [NSString stringWithFormat:@"delete from image1 where image_id = %@", pic.image_id];
    int result = sqlite3_exec(dbPoint, [deleteSQL UTF8String], NULL, NULL, NULL);
    return [self isOperationResult:result alertText:@"删除一条数据"];
}


- (BOOL)isOperationResult:(int)result alertText:(NSString *)alertText {
    BOOL isOperation = YES;
    if (result == SQLITE_OK) {
//        NSLog(@"%@成功", alertText);
        isOperation = YES;
    } else {
//        NSLog(@"%@失败", alertText);
        isOperation = NO;
    }
    return isOperation;
}







@end
